<?php
use frontend\modules\yii2\widgets\layouts\markdown\Markdown;
use frontend\modules\yii2\widgets\layouts\example\Example;
use yii\bootstrap\Button;
use yii\bootstrap\Alert;

$this->title = '用Yiisoft官方docker镜像安装Yii框架';
$this->registerMetaTag([
    'name' => 'keywords',
    'content' => 'yii,git,docker,Yii2,install,容器,镜像，框架,安装,教程'
]);
$this->registerMetaTag([
    'name' => 'description',
    'content' => '介绍如何以Yiisoft官方发布的docker容器镜像安装Yii框架'
]);
$this->registerMetaTag([
    'name' => 'author',
    'content' => 'chenzhiwei'
]);

$html = [
    "markdown0" => <<<M0
# 用Yiisoft官方docker镜像安装Yii框架
首先介绍一下参考资料：
- Yiisoft官方发布的容器镜像：[点我前往Dockerhub](https://hub.docker.com/r/yiisoftware/yii2-php)；
- `yiisoftware/yii2-php`容器的参考文档：[点我去Github](https://github.com/yiisoft/yii2-docker)，[点我去Gitee](https://gitee.com/lvzmen_github/yii2-docker)。


## 下载Yii源码
由于Yii的源码中有适应于当前版本的docker文件，因此先下载指定版本的Yii框架源码，再利用源码中的docker文件搭建YII运行环境是比较好的选择。
```shell
sudo git clone -b 2.0.43.1.1 https://gitee.com/lv_frame/yii.git yii_advanced
sudo chown www-data:www-data -R yii_advanced
```
> 注意：2.0.43.1.1是在yii官方发布2.0.43版本后进行初始化后的版本，主要作了如下修改：
- 下载了compose依赖，并把vendor文件夹纳入git仓库管理，避免了有些朋友在本地composr工具版本问题而无法拉取依赖的问题；
- 执行init脚本初始化了yii框架，添加了配置文件和入口文件；

下载源码后，我们需要注意下面这几个文件：
```shell
.
├── backend
│   └── Dockerfile
├── frontend
│   └── Dockerfile
└── docker-compose.yml
```
`docker-compose.yml`文件是入口文件，它依赖于`backend`和`frontend`下的`Dockerfile`文件，因此如果你想要原汁原味地安装Yii，则要保证这三个文件的有效性，那怎么用呢？
你必须在docker-compose.yml文件所在目录下，用命令行启用：
```
cd yii_advanced
docker-compose up -d
```
查看是否容器是否已经启动：
```shell
yii_advanced$ sudo docker ps --format "table {{.ID}}\\t{{.Names}}\\t{{.Image}}"
CONTAINER ID   NAMES                     IMAGE
9ce7ce6dd321   yii_advanced-mysql-1      mysql:5.7
fc10a9ab1d6c   yii_advanced-frontend-1   yii_advanced_frontend
4e4ca1447394   yii_advanced-backend-1    yii_advanced_backend
```
如果你有上述的输出则表示容器成功启动，我们从`docker-compose.yml`文件中得知，可以通过`21080`端口访问后台，通过`20080`端口访问前台：
![Yii前台首页](/images/20211116171824.png "Yii前台首页")

上述的安装方法虽然也属于一键安装，但是有如下缺点：
- 容器内的服务器使用`apache`，对于只熟悉`nginx`的开发者不利于调配参数；
- 使用的容器是基于`yiisoftware/yii2-php`而不是直接用php官方发布的docker容器，安装php扩展比较困难，因为`yiisoftware`提供的镜像文档比较简单，没有php官方提供的镜像文档丰富；

介于上述问题，我们基于Php官方推出的容器镜像设计了以nginx为服务器的容器镜像`chenzhiweiwk/php-fpm`，我们有分享创建此镜像的Dockerfile文件，因此大家如果想要某个特定php版本的容器，只需要修改一下Dockerfile文件内的基础镜像即可自行创建相关的镜像。
M0,
];

foreach($html as $name => $item){
    switch ($name) {
        case strpos($name, "example") !== false:
            echo Example::widget($item);
            break;
        case strpos($name, "markdown") !== false:
            echo Markdown::widget(["content" => $item]);
            break;
        default:
            break;
    }
}